package fr.univ.colloque.servlet;

import fr.univ.colloque.dao.ColloqueDao;
import fr.univ.colloque.dao.ExposeDao;
import fr.univ.colloque.dao.InstitutionDao;
import fr.univ.colloque.dao.MotCleDao;
import fr.univ.colloque.dao.PersonneDao;
import fr.univ.colloque.data.Candidat;
import fr.univ.colloque.data.Colloque;
import fr.univ.colloque.data.Expose;
import fr.univ.colloque.data.Institution;
import fr.univ.colloque.data.MotCle;
import fr.univ.colloque.data.Personne;
import fr.univ.colloque.util.Link;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ProposeExpose extends HttpServlet
{
    // Messages d'erreur

    private static String ERR_NOM_ABS = "La saisie d'un nom est obligatoire";
    private static String ERR_PRENOM_ABS = "La saisie d'un prénom est obligatoire";
    private static String ERR_EMAIL_ABS = "La saisie d'un email est obligatoire";
    private static String ERR_EMAIL_EXIST = "Cet email existe déjà. Veuillez vous connecter pour déposer un exposé";
    private static String ERR_EMAIL_FORMAT = "Mauvais format d'email.";
    private static String ERR_INSTIT_ABS = "La saisie d'une institution est obligatoire";
    private static String ERR_LOGIN_ABS = "La saisie d'un login est obligatoire";
    private static String ERR_MDP_ABS = "La saisie d'un mot de passe est obligatoire";
    private static String ERR_MC1_ABS = "La saisie d'un premier mot clef est obligatoire";
    private static String ERR_MC2_ABS = "La saisie d'un deuxième mot clef est obligatoire";
    private static String ERR_MC3_ABS = "La saisie d'un troisième mot clef est obligatoire";
    private static String ERR_MC_IDENTIQUE = "Les mots clés doivent être différents";
    private static String ERR_TITRE_ABS = "La saisie d'un titre obligatoire";
    private static String ERR_RESUME_ABS = "La saisie d'un résumé est obligatoire";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        HttpSession session = req.getSession();

        Link lien = Link.FORM_COLLOQUE_NV_EXPOSE;

        Personne connecte = (Personne) session.getAttribute("user");

        if (connecte != null && !lien.getType().equals(connecte.getType()))
        {
            // La personne connecté n'a pas les droits nécessaires pour accéder à cette page
            resp.sendRedirect("indexCo.jsp?e=1");
        }
        else
        {

            if (connecte != null)
            {
                Expose expose = new Expose();
                expose.setPersonne(connecte);
                req.setAttribute("expose", expose);
            }

            // récupération de l'id du colloque passé en paramètre
            int identifiant = Integer.parseInt(req.getParameter("id"));

            // génération d'un objet DaoColloque et appel de la fonction pour obtenir
            // un objet colloque à partir de l'identifiant

            ColloqueDao coDao = new ColloqueDao();
            Colloque Colloc = coDao.get(identifiant, true);
            // On aura besoin du colloque dans le doPost donc on le stocke temporairement dans la session
            session.setAttribute("Colloc", Colloc);

            stockerEnRequeteData(req);

            req.setAttribute("err", null);
            // Page qu'il va mettre dans la partie à droite du menu
            // ici la jsp en charge de proposer le formulaire de saisie du nouvel
            // exposé
            req.setAttribute("page", lien);

            //redirection ves le patron d'affichage
            if (connecte == null)
            {
                // zone visiteur donc affiche pas le menu
                req.getRequestDispatcher("index.jsp").forward(req, resp);
            }
            else
            {
                // zone connecté donc affiche le menu
                req.getRequestDispatcher("indexCo.jsp").forward(req, resp);
            }
        }

    }

    private void stockerEnRequeteData(HttpServletRequest req)
    {
        HttpSession session = req.getSession();
        Colloque co = (Colloque) session.getAttribute("Colloc");

        //génération d'une liste des mots cles
        List<MotCle> listeMotCle;
        listeMotCle = co.getLstMotCle();

        /* génération d'une liste des institions existantes
         * pour permettre à la jsp fExposeNouv de disposer des éléments pour
         * alimenter la liste déroulante.
         */
        InstitutionDao instDao = new InstitutionDao();
        List<Institution> listeInstitution;
        listeInstitution = instDao.getListeInstitutions();

        req.setAttribute("listeInstitution", listeInstitution);
        req.setAttribute("listeMotCle", listeMotCle);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        HttpSession session = req.getSession();

        Personne personne = (Personne) session.getAttribute("user");

        // vérification de la saisie; valeur obligatoire RG
        String leNom = req.getParameter("nom");
        String lePrenom = req.getParameter("prenom");
        String leMail = req.getParameter("email");
        String lInstitution = req.getParameter("institution");
        String leLogin = req.getParameter("login");
        String leMotDePasse = req.getParameter("motdepasse");

        String leMotCle1 = req.getParameter("mc1");
        String leMotCle2 = req.getParameter("mc2");
        String leMotCle3 = req.getParameter("mc3");
        String leResume = req.getParameter("resume");
        String leTitre = req.getParameter("titre");

        /*
         * vérification du respect des règles de gestion au niveau des 
         * saisies dans le formulaire  req.setAttribute("err", "Saisie invalide");
         */
        boolean erreur = false;
        ArrayList<String> lstMsg;
        lstMsg = new ArrayList<String>();

        Expose expose = new Expose();
        Candidat auteur = new Candidat();

        if (personne == null)
        {

            if (leNom == null || leNom.equals(""))
            {
                erreur = true;
                lstMsg.add(ERR_NOM_ABS);
            }
            else
            {
                auteur.setNom(leNom);
            }

            if (lePrenom == null || lePrenom.equals(""))
            {
                erreur = true;
                lstMsg.add(ERR_PRENOM_ABS);

            }
            else
            {
                auteur.setPrenom(lePrenom);
            }


            if (leMail == null || leMail.equals(""))
            {
                erreur = true;
                lstMsg.add(ERR_EMAIL_ABS);
            }
            else
            {
                if (verifierEmail(leMail))
                {
                    PersonneDao pDao = new PersonneDao();
                    if (pDao.isEmailExist(leMail))
                    {
                        erreur = true;
                        lstMsg.add(ERR_EMAIL_EXIST);
                    }
                    else
                    {
                        auteur.setEmail(leMail);
                    }
                }
                else
                {
                    erreur = true;
                    lstMsg.add(ERR_EMAIL_FORMAT);
                }
            }

            if (lInstitution == null || "null".equals(lInstitution))
            {
                erreur = true;
                lstMsg.add(ERR_INSTIT_ABS);

            }
            else
            {
                int idInstitution = Integer.parseInt(lInstitution);
                InstitutionDao iDao = new InstitutionDao();
                Institution instit = iDao.get(idInstitution);

                auteur.setInstitution(instit);
            }

            if (leLogin == null || leLogin.equals(""))
            {
                erreur = true;
                lstMsg.add(ERR_LOGIN_ABS);

            }
            else
            {
                auteur.setLogin(leLogin);
            }

            if (leMotDePasse == null || leMotDePasse.equals(""))
            {
                erreur = true;
                lstMsg.add(ERR_MDP_ABS);

            }
            else
            {
                auteur.setPassword(leMotDePasse);
            }
        }
        else
        {
            auteur = (Candidat) personne;
        }
        //ici test du respect du formalisme de l'email
        if (leMotCle1 == null || leMotCle2 == null || leMotCle3 == null)
        {
            if (leMotCle1 == null)
            {
                erreur = true;
                lstMsg.add(ERR_MC1_ABS);

            }
            if (leMotCle2 == null)
            {
                erreur = true;
                lstMsg.add(ERR_MC2_ABS);

            }
            if (leMotCle3 == null)
            {
                erreur = true;
                lstMsg.add(ERR_MC3_ABS);
            }
        }
        else
        {
            if (leMotCle1.equals(leMotCle3) || leMotCle1.equals(leMotCle2) || leMotCle2.equals(leMotCle3))
            {
                erreur = true;
                lstMsg.add(ERR_MC_IDENTIQUE);
            }
            else
            {
                List<MotCle> lstMc = new ArrayList<MotCle>();
                MotCleDao mcDao = new MotCleDao();
                int idMc1 = Integer.parseInt(leMotCle1);
                int idMc2 = Integer.parseInt(leMotCle2);
                int idMc3 = Integer.parseInt(leMotCle3);

                MotCle mc1 = mcDao.get(idMc1);
                MotCle mc2 = mcDao.get(idMc2);
                MotCle mc3 = mcDao.get(idMc3);

                lstMc.add(mc1);
                lstMc.add(mc2);
                lstMc.add(mc3);

                expose.setLstMc(lstMc);
            }
        }

        if (leTitre == null || leTitre.equals(""))
        {
            erreur = true;
            lstMsg.add(ERR_TITRE_ABS);
        }
        else
        {
            expose.setLibelle(leTitre);
        }

        if (leResume == null || leResume.equals(""))
        {
            erreur = true;
            lstMsg.add(ERR_RESUME_ABS);

        }
        else
        {
            expose.setResume(leResume);
        }

        /* on teste si il y a une erreure */
        expose.setPersonne(auteur);
        Link lien = Link.FORM_COLLOQUE_NV_EXPOSE;
        req.setAttribute("page", lien);
        if (erreur == true)
        {
            stockerEnRequeteData(req);
            req.setAttribute("lstErr", lstMsg);
            req.setAttribute("expose", expose);

            if (personne == null)
            {
                // zone visiteur donc affiche pas le menu
                req.getRequestDispatcher("index.jsp").forward(req, resp);
            }
            else
            {
                // zone connecté donc affiche le menu
                req.getRequestDispatcher("indexCo.jsp").forward(req, resp);
            }
        }
        else
        {
            Colloque co = (Colloque) session.getAttribute("Colloc");
            expose.setColloc(co);

            PersonneDao pDao = new PersonneDao();
            Integer idPersonne;

            if (expose.getPersonne().getId() == null)
            {
                idPersonne = pDao.save(expose.getPersonne());
                expose.getPersonne().setId(idPersonne);
            }
            
            ExposeDao eDao = new ExposeDao();
            Integer idExpose = eDao.save(expose);
            expose.setId(idExpose);

            MotCleDao mcDao = new MotCleDao();
            mcDao.saveMcExpose(idExpose, expose.getLstMc());

            // Supprime le colloque de la session
            session.removeAttribute("Colloc");

            if (personne == null)
            {
                // zone visiteur donc affiche pas le menu
                resp.sendRedirect("index.jsp");
            }
            else
            {
                // zone connecté donc affiche le menu
                resp.sendRedirect("indexCo.jsp");
            }
        }
    }

    private boolean verifierEmail(String email)
    {
        boolean formatOk = Pattern.matches("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)+$", email);

        return formatOk;
    }
}
